package ace.cmp.sdk.api;

import ace.cmp.core.model.R;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import java.util.List;
import java.util.Map;

/**
 * @author caspar
 * @date 2023/9/14 19:08
 */
public interface SdkApi<EntityDtoT, IdT> {

  /**
   * 保存，新增或者修改.
   *
   * @return id
   */
  R<IdT> save(@Valid @NotNull EntityDtoT input);

  /**
   * 保存，新增或者修改,只处理不为null的字段.
   *
   * @return id
   */
  R<IdT> saveNotNullField(@Valid @NotNull EntityDtoT input);

  /**
   * 新增.
   *
   * @param input
   * @return id
   */
  R<IdT> add(@Valid @NotNull EntityDtoT input);

  /**
   * 新增,只处理不为null的字段.
   *
   * @param input
   * @return id
   */
  R<IdT> addNotNullField(@Valid @NotNull EntityDtoT input);

  /**
   * 修改.
   *
   * @param input
   * @return
   */
  R<IdT> modify(@Valid @NotNull EntityDtoT input);

  /**
   * 修改,只处理不为null的字段.
   *
   * @param input
   * @return
   */
  R<IdT> modifyNotNullField(@Valid @NotNull EntityDtoT input);

  /**
   * 删除.
   *
   * @param input
   * @return
   */
  R<Boolean> remove(@Valid @NotEmpty List<IdT> input);

  /**
   * 逻辑删除.
   *
   * @param input
   * @return
   */
  R<Boolean> removeLogic(@Valid @NotEmpty List<IdT> input);

  /**
   * 获取明细.
   *
   * @param id
   * @return
   */
  R<EntityDtoT> getById(@Valid @NotNull IdT id);

  /**
   * 根据id批量获取.
   *
   * @param ids
   * @return
   */
  R<List<EntityDtoT>> getListByIdIn(@Valid @NotEmpty IdT... ids);

  /**
   * 根据id批量获取,返回Map数据结构，key:实体id,value:实体.
   *
   * @param ids
   * @return
   */
  R<Map<IdT, EntityDtoT>> getMapByIdIn(@Valid @NotEmpty IdT... ids);
}
